home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 May (DVD) / Macworld Resource DVD May 2003.toast / Data / Software / Bonus / Database / mysql-max-3.23.55.sit / mysql-max-3.23.55-apple-darwi.1 / tests / grant.pl < prev    next >
Encoding:
Perl Script  |  2003-01-21  |  19.7 KB  |  561 lines  |  [TEXT/McPL]

  1. #!/usr/bin/perl
  2. #
  3. # Testing of grants.
  4. # Note that this will delete all table and column grants !
  5. #
  6.  
  7. use DBI;
  8. use Getopt::Long;
  9. use strict;
  10.  
  11. use vars qw($dbh $user_dbh $opt_help $opt_Information $opt_force $opt_debug 
  12.         $opt_verbose $opt_server $opt_root_user $opt_password $opt_user 
  13.         $opt_database $opt_host $version $user $tables_cols $columns_cols);
  14.  
  15. $version="1.0";
  16. $opt_help=$opt_Information=$opt_force=$opt_debug=$opt_verbose=0;
  17. $opt_host="localhost",
  18. $opt_server="mysql";
  19. $opt_root_user="root";
  20. $opt_password="";
  21. $opt_user="grant_user";
  22. $opt_database="grant_test";
  23.  
  24. GetOptions("Information","help","server=s","root-user=s","password=s","user","database=s","force","host=s","debug","verbose") || usage();
  25. usage() if ($opt_help || $opt_Information);
  26.  
  27. $user="$opt_user\@$opt_host";
  28.  
  29. if (!$opt_force)
  30. {
  31.   print_info()
  32. }
  33.  
  34. $|=1;
  35.  
  36. $tables_cols="Host, Db, User, Table_name, Grantor, Table_priv, Column_priv";
  37. $columns_cols="Host, Db, User, Table_name, Column_name, Column_priv";
  38.  
  39. #
  40. # clear grant tables
  41. #
  42.  
  43. $dbh = DBI->connect("DBI:mysql:mysql:$opt_host",
  44.             $opt_root_user,$opt_password,
  45.             { PrintError => 0}) || die "Can't connect to mysql server with user '$opt_root_user': $DBI::errstr\n";
  46.  
  47. safe_query("delete from user where user='$opt_user' or user='${opt_user}2'");
  48. safe_query("delete from db where user='$opt_user'");
  49. safe_query("delete from tables_priv");
  50. safe_query("delete from columns_priv");
  51. safe_query("lock tables mysql.user write"); # Test lock tables
  52. safe_query("flush privileges");
  53. safe_query("unlock tables");         # should already be unlocked
  54. safe_query("drop database $opt_database",2);
  55. safe_query("create database $opt_database");
  56.  
  57. # check that the user can't login yet
  58.  
  59. user_connect(1);
  60. #goto test;
  61.  
  62. #
  63. # Test grants on user level
  64. #
  65.  
  66. safe_query("grant select on *.* to $user");
  67. safe_query("set password FOR ${opt_user}2\@$opt_host = password('test')",1);
  68. safe_query("set password FOR $opt_user=password('test')");
  69. user_connect(1);
  70. safe_query("set password FOR $opt_user=''");
  71. user_connect(0);
  72. user_query("select * from mysql.user where user = '$opt_user'");
  73. user_query("select * from mysql.db where user = '$opt_user'");
  74. safe_query("grant select on *.* to $user,$user");
  75.  
  76. # The following should fail
  77. user_query("insert into mysql.user (host,user) values ('error','$opt_user')",1);
  78. user_query("update mysql.user set host='error' WHERE user='$opt_user'",1);
  79. user_query("create table $opt_database.test (a int,b int)",1);
  80. user_query("grant select on *.* to ${opt_user}2\@$opt_host",1);
  81. safe_query("revoke select on $opt_database.test from $opt_user\@opt_host",1);
  82. safe_query("revoke select on $opt_database.* from $opt_user\@opt_host",1);
  83. safe_query("revoke select on *.* from $opt_user",1);
  84. safe_query("grant select on $opt_database.not_exists to $opt_user",1);
  85. safe_query("grant FILE on $opt_database.test to $opt_user",1);
  86. safe_query("grant select on *.* to wrong___________user_name",1);
  87. safe_query("grant select on $opt_database.* to wrong___________user_name",1);
  88. user_query("grant select on $opt_database.test to $opt_user with grant option",1);
  89. safe_query("set password FOR ''\@''=''",1);
  90. user_query("set password FOR root\@$opt_host = password('test')",1);
  91.  
  92. # Change privileges for user
  93. safe_query("revoke select on *.* from $user");
  94. safe_query("grant create on *.* to $user");
  95. user_connect(0);
  96. user_query("create table $opt_database.test (a int,b int)");
  97.  
  98. safe_query("grant select(c) on $opt_database.test to $user",1);
  99. safe_query("revoke select(c) on $opt_database.test from $user",1);
  100. safe_query("grant select on $opt_database.test to wrong___________user_name",1);
  101. user_query("INSERT INTO $opt_database.test values (2,0)",1);
  102.  
  103. safe_query("grant ALL PRIVILEGES on *.* to $user");
  104. safe_query("REVOKE INSERT on *.* from $user");
  105. user_connect(0);
  106. user_query("INSERT INTO $opt_database.test values (1,0)",1);
  107. safe_query("grant INSERT on *.* to $user");
  108. user_connect(0);
  109. user_query("INSERT INTO $opt_database.test values (2,0)");
  110. user_query("select count(*) from $opt_database.test");
  111. safe_query("revoke SELECT on *.* from $user");
  112. user_connect(0);
  113. user_query("select count(*) from $opt_database.test",1);
  114. user_query("INSERT INTO $opt_database.test values (3,0)");
  115. safe_query("grant SELECT on *.* to $user");
  116. user_connect(0);
  117. user_query("select count(*) from $opt_database.test");
  118. safe_query("revoke ALL PRIVILEGES on *.* from $user");
  119. user_connect(1);
  120. safe_query("delete from user where user='$opt_user'");
  121. safe_query("flush privileges");
  122. if (0)                # Only if no anonymous user on localhost.
  123. {
  124.   safe_query("grant select on *.* to $opt_user");
  125.   user_connect(0);
  126.   safe_query("revoke select on *.* from $opt_user");
  127.   user_connect(1);
  128. }
  129. safe_query("delete from user where user='$opt_user'");
  130. safe_query("flush privileges");
  131.  
  132. #
  133. # Test grants on database level
  134. #
  135. safe_query("grant select on $opt_database.* to $user");
  136. safe_query("select * from mysql.user where user = '$opt_user'");
  137. safe_query("select * from mysql.db where user = '$opt_user'");
  138. user_connect(0);
  139. user_query("select count(*) from $opt_database.test");
  140. # The following should fail
  141. user_query("select * from mysql.user where user = '$opt_user'",1);
  142. user_query("insert into $opt_database.test values (4,0)",1);
  143. user_query("update $opt_database.test set a=1",1); 
  144. user_query("delete from $opt_database.test",1); 
  145. user_query("create table $opt_database.test2 (a int)",1);
  146. user_query("ALTER TABLE $opt_database.test add c int",1);
  147. user_query("CREATE INDEX dummy ON $opt_database.test (a)",1);
  148. user_query("drop table $opt_database.test",1);
  149. user_query("grant ALL PRIVILEGES on $opt_database.* to ${opt_user}2\@$opt_host",1);
  150.  
  151. # Change privileges for user
  152. safe_query("grant ALL PRIVILEGES on $opt_database.* to $user WITH GRANT OPTION");
  153. user_connect(0);
  154. user_query("insert into $opt_database.test values (5,0)");
  155. safe_query("REVOKE ALL PRIVILEGES on * from $user",1);
  156. safe_query("REVOKE ALL PRIVILEGES on *.* from $user");
  157. safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user");
  158. safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user");
  159. user_connect(0);
  160. user_query("insert into $opt_database.test values (6,0)",1);
  161. safe_query("REVOKE GRANT OPTION on $opt_database.* from $user");
  162. user_connect(1);
  163. safe_query("grant ALL PRIVILEGES on $opt_database.* to $user");
  164.  
  165. user_connect(0);
  166. user_query("select * from mysql.user where user = '$opt_user'",1);
  167. user_query("insert into $opt_database.test values (7,0)");
  168. user_query("update $opt_database.test set a=3 where a=2"); 
  169. user_query("delete from $opt_database.test where a=3"); 
  170. user_query("create table $opt_database.test2 (a int not null)");
  171. user_query("alter table $opt_database.test2 add b int");
  172. user_query("create index dummy on $opt_database.test2 (a)");
  173. user_query("drop table $opt_database.test2");
  174. user_query("show tables from grant_test");
  175. # These should fail
  176. user_query("insert into mysql.user (host,user) values ('error','$opt_user',0)",1);
  177.  
  178. # Revoke database privileges
  179. safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user");
  180. safe_query("select * from mysql.user where user = '$opt_user'");
  181. safe_query("select * from mysql.db where user = '$opt_user'");
  182. user_connect(1);
  183.  
  184. #
  185. # Test of grants on table level
  186. #
  187.  
  188. safe_query("grant create on $opt_database.test2 to $user");
  189. user_connect(0);
  190. user_query("create table $opt_database.test2 (a int not null)");
  191. user_query("show tables");    # Should only show test, not test2
  192. user_query("show columns from test",1);
  193. user_query("show keys from test",1);
  194. user_query("show columns from test2");
  195. user_query("show keys from test2");
  196. user_query("select * from test",1);
  197. safe_query("grant insert on $opt_database.test to $user");
  198. user_query("show tables");
  199. user_query("insert into $opt_database.test values (8,0)");
  200. user_query("update $opt_database.test set b=1",1);
  201. safe_query("grant update on $opt_database.test to $user");
  202. user_query("update $opt_database.test set b=2");
  203. user_query("delete from $opt_database.test",1);
  204. safe_query("grant delete on $opt_database.test to $user");
  205. user_query("delete from $opt_database.test where a=1",1);
  206. user_query("update $opt_database.test set b=3 where b=1",1);
  207. user_query("update $opt_database.test set b=b+1",1);
  208.  
  209. # Add one privilege at a time until the user has all privileges
  210. user_query("select * from test",1);
  211. safe_query("grant select on $opt_database.test to $user");
  212. user_query("delete from $opt_database.test where a=1");
  213. user_query("update $opt_database.test set b=2 where b=1");
  214. user_query("update $opt_database.test set b=b+1");
  215. user_query("select count(*) from test");
  216.  
  217. user_query("create table $opt_database.test3 (a int)",1);
  218. user_query("alter table $opt_database.test2 add c int",1);
  219. safe_query("grant alter on $opt_database.test2 to $user");
  220. user_query("alter table $opt_database.test2 add c int");
  221. user_query("create index dummy ON $opt_database.test (a)",1);
  222. safe_query("grant index on $opt_database.test2 to $user");
  223. user_query("create index dummy ON $opt_database.test2 (a)");
  224. user_query("insert into test2 SELECT a,a from test",1);
  225. safe_query("grant insert on test2 to $user",1);    # No table: mysql.test2
  226. safe_query("grant insert(a) on $opt_database.test2 to $user");
  227. user_query("insert into test2 SELECT a,a from test",1);
  228. safe_query("grant insert(c) on $opt_database.test2 to $user");
  229. user_query("insert into test2 SELECT a,a from test");
  230. user_query("select count(*) from test2,test",1);
  231. user_query("select count(*) from test,test2",1);
  232. user_query("replace into test2 SELECT a from test",1);
  233. safe_query("grant update on $opt_database.test2 to $user");
  234. user_query("replace into test2 SELECT a,a from test",1);
  235. safe_query("grant DELETE on $opt_database.test2 to $user");
  236. user_query("replace into test2 SELECT a,a from test");
  237. user_query("insert into test (a) SELECT a from test2",1);
  238.  
  239. user_query("drop table $opt_database.test2",1);
  240. user_query("grant select on $opt_database.test2 to $user with grant option",1);
  241. safe_query("grant drop on $opt_database.test2 to $user with grant option");
  242. user_query("grant drop on $opt_database.test2 to $user with grant option");
  243. user_query("grant select on $opt_database.test2 to $user with grant option",1);
  244.  
  245. # check rename privileges
  246. user_query("rename table $opt_database.test2 to $opt_database.test3",1);
  247. safe_query("grant CREATE,DROP on $opt_database.test3 to $user");
  248. user_query("rename table $opt_database.test2 to $opt_database.test3",1);
  249. user_query("create table $opt_database.test3 (a int)");
  250. safe_query("grant INSERT on $opt_database.test3 to $user");
  251. user_query("drop table $opt_database.test3");
  252. user_query("rename table $opt_database.test2 to $opt_database.test3");
  253. user_query("rename table $opt_database.test3 to $opt_database.test2",1);
  254. safe_query("grant ALTER on $opt_database.test3 to $user");
  255. user_query("rename table $opt_database.test3 to $opt_database.test2");
  256. safe_query("revoke DROP on $opt_database.test2 from $user");
  257. user_query("rename table $opt_database.test2 to $opt_database.test3");
  258. user_query("drop table if exists $opt_database.test2,$opt_database.test3",1);
  259. safe_query("drop table if exists $opt_database.test2,$opt_database.test3");
  260.  
  261. # Check that the user doesn't have some user privileges
  262. user_query("create database $opt_database",1);
  263. user_query("drop database $opt_database",1);
  264. user_query("flush tables",1);
  265. safe_query("flush privileges");
  266.  
  267. safe_query("select $tables_cols from mysql.tables_priv");
  268. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  269. safe_query("revoke ALL PRIVILEGES on $opt_database.test2 from $user");
  270. safe_query("revoke ALL PRIVILEGES on $opt_database.test3 from $user");
  271. safe_query("revoke GRANT OPTION on $opt_database.test2 from $user");
  272. safe_query("select $tables_cols from mysql.tables_priv");
  273. user_query("select count(a) from test",1);
  274.  
  275. #
  276. # Test some grants on column level
  277. #
  278.  
  279. user_query("delete from $opt_database.test where a=2",1);
  280. user_query("delete from $opt_database.test where A=2",1);
  281. user_query("update test set b=5 where b>0",1);
  282. safe_query("grant update(b),delete on $opt_database.test to $user");
  283. safe_query("revoke update(a) on $opt_database.test from $user",1);
  284. user_query("delete from $opt_database.test where a=2",1);
  285. user_query("update test set b=5 where b>0",1);
  286. safe_query("grant select(a),select(b) on $opt_database.test to $user");
  287. user_query("delete from $opt_database.test where a=2");
  288. user_query("delete from $opt_database.test where A=2");
  289. user_query("update test set b=5 where b>0");
  290. user_query("update test set a=11 where b>5",1);
  291. user_query("select a,A from test");
  292.  
  293. safe_query("select $tables_cols from mysql.tables_priv");
  294. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  295. safe_query("select $tables_cols from mysql.tables_priv");
  296. safe_query("revoke GRANT OPTION on $opt_database.test from $user",1);
  297. #
  298. # Test grants on database level
  299. #
  300.  
  301. safe_query("grant select(a) on $opt_database.test to $user");
  302. user_query("show full columns from test");
  303. safe_query("grant insert (b), update (b) on $opt_database.test to $user");
  304.  
  305. user_query("select count(a) from test");
  306. user_query("select count(skr.a) from test as skr");
  307. user_query("select count(a) from test where a > 5");
  308. user_query("insert into test (b) values (5)");
  309. user_query("insert into test (b) values (a)");
  310. user_query("update test set b=3 where a > 0");
  311.  
  312. user_query("select * from test",1);
  313. user_query("select b from test",1);
  314. user_query("select a from test where b > 0",1);
  315. user_query("insert into test (a) values (10)",1);
  316. user_query("insert into test (b) values (b)",1);
  317. user_query("insert into test (a,b) values (1,5)",1);
  318. user_query("insert into test (b) values (1),(b)",1);
  319. user_query("update test set b=3 where b > 0",1);
  320.  
  321. safe_query("select $tables_cols from mysql.tables_priv");
  322. safe_query("select $columns_cols from mysql.columns_priv");
  323. safe_query("revoke select(a), update (b) on $opt_database.test from $user");
  324. safe_query("select $tables_cols from mysql.tables_priv");
  325. safe_query("select $columns_cols from mysql.columns_priv");
  326.  
  327. user_query("select count(a) from test",1);
  328. user_query("update test set b=4",1);
  329.  
  330. safe_query("grant select(a,b), update (a,b) on $opt_database.test to $user");
  331. user_query("select count(a),count(b) from test where a+b > 0");
  332. user_query("insert into test (b) values (9)");
  333. user_query("update test set b=6 where b > 0");
  334.  
  335. safe_query("flush privileges");    # Test restoring privileges from disk
  336. safe_query("select $tables_cols from mysql.tables_priv");
  337. safe_query("select $columns_cols from mysql.columns_priv");
  338.  
  339. # Try mixing of table and database privileges
  340.  
  341. user_query("insert into test (a,b) values (12,12)",1);
  342. safe_query("grant insert on $opt_database.* to $user");
  343. user_connect(0);
  344. user_query("insert into test (a,b) values (13,13)");
  345.  
  346. # This grants and revokes SELECT on different levels.
  347. safe_query("revoke select(b) on $opt_database.test from $user");
  348. user_query("select count(a) from test where a+b > 0",1);
  349. user_query("update test set b=5 where a=2");
  350. safe_query("grant select on $opt_database.test to $user");
  351. user_connect(0);
  352. user_query("select count(a) from test where a+b > 0");
  353. safe_query("revoke select(b) on $opt_database.test from $user");
  354. user_query("select count(a) from test where a+b > 0");
  355. safe_query("revoke select on $opt_database.test from $user");
  356. user_connect(0);
  357. user_query("select count(a) from test where a+b > 0",1);
  358. safe_query("grant select(a) on $opt_database.test to $user");
  359. user_query("select count(a) from test where a+b > 0",1);
  360. safe_query("grant select on *.* to $user");
  361. user_connect(0);
  362. user_query("select count(a) from test where a+b > 0");
  363. safe_query("revoke select on *.* from $user");
  364. safe_query("grant select(b) on $opt_database.test to $user");
  365. user_connect(0);
  366. user_query("select count(a) from test where a+b > 0");
  367.  
  368.  
  369. safe_query("select * from mysql.db where user = '$opt_user'");
  370. safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
  371. safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
  372.  
  373. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  374. user_query("select count(a) from test",1);
  375. user_query("select * from mysql.user",1);
  376. safe_query("select * from mysql.db where user = '$opt_user'");
  377. safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
  378. safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
  379.  
  380. #
  381. # Test IDENTIFIED BY
  382. #
  383.  
  384. safe_query("delete from user where user='$opt_user'");
  385. safe_query("flush privileges");
  386. safe_query("grant ALL PRIVILEGES on $opt_database.test to $user identified by 'dummy',  ${opt_user}\@127.0.0.1 identified by 'dummy2'");
  387. user_connect(0,"dummy");
  388. safe_query("grant SELECT on $opt_database.* to $user identified by ''");
  389. user_connect(0);
  390.  
  391. #
  392. # Clean up things
  393. #
  394.  
  395. safe_query("drop database $opt_database");
  396. safe_query("delete from user where user='$opt_user'");
  397. safe_query("delete from db where user='$opt_user'");
  398. safe_query("delete from tables_priv");
  399. safe_query("delete from columns_priv");
  400. safe_query("flush privileges");
  401.  
  402. print "end of test\n";
  403. exit 0;
  404.  
  405. sub usage
  406. {
  407.     print <<EOF;
  408. $0  Ver $version
  409.  
  410. This program tests that the GRANT commands works by creating a temporary
  411. database ($opt_database) and user ($opt_user).
  412.  
  413. Options:
  414.  
  415. --database (Default $opt_database)
  416.   In which database the test tables are created.
  417.  
  418. --force
  419.   Don''t ask any question before starting this test.
  420.  
  421. --host='host name' (Default $opt_host)
  422.   Host name where the database server is located.
  423.  
  424. --Information
  425. --help
  426.   Print this help
  427.  
  428. --password
  429.   Password for root-user.
  430.  
  431. --server='server name'  (Default $opt_server)
  432.   Run the test on the given SQL server.
  433.  
  434. --user  (Default $opt_user)
  435.   A non-existing user on which we will test the GRANT commands.
  436.  
  437. --verbose
  438.   Write all queries when we are execute them.
  439.  
  440. --root-user='user name' (Default $opt_root_user)
  441.   User with privileges to modify the 'mysql' database.
  442. EOF
  443.   exit(0);
  444. }
  445.  
  446.  
  447. sub print_info
  448. {
  449.   my $tmp;
  450.   print <<EOF;
  451. This test will clear your table and column grant table and recreate the
  452. $opt_database database !
  453. All privileges for $user will be destroyed !
  454.  
  455. Don\'t run this test if you have done any GRANT commands that you want to keep!
  456. EOF
  457.  for (;;)
  458.   {
  459.     print "Start test (yes/no) ? ";
  460.     $tmp=<STDIN>; chomp($tmp); $tmp=lc($tmp);
  461.     last if ($tmp =~ /^yes$/i);
  462.     exit 1 if ($tmp =~ /^n/i);
  463.     print "\n";
  464.   }
  465. }
  466.  
  467.  
  468. sub user_connect
  469. {
  470.   my ($ignore_error,$password)=@_;
  471.   $password="" if (!defined($password));
  472.  
  473.   print "Connecting $opt_user\n" if ($opt_verbose);
  474.   $user_dbh->disconnect if (defined($user_dbh));
  475.  
  476.   $user_dbh=DBI->connect("DBI:mysql:$opt_database:$opt_host",$opt_user,
  477.              $password, { PrintError => 0});
  478.   if (!$user_dbh)
  479.   {
  480.     print "$DBI::errstr\n";
  481.     if (!$ignore_error)
  482.     {
  483.       die "The above should not have failed!";
  484.     }
  485.   }
  486.   elsif ($ignore_error)
  487.   {
  488.     die "Connect succeeded when it shouldn't have !\n";
  489.   }
  490. }
  491.  
  492. sub safe_query
  493. {
  494.   my ($query,$ignore_error)=@_;
  495.   if (do_query($dbh,$query))
  496.   {
  497.     if (!defined($ignore_error))
  498.     {
  499.       die "The above should not have failed!";
  500.     }
  501.   }
  502.   elsif (defined($ignore_error) && $ignore_error == 1)
  503.   {
  504.     die "Query '$query' succeeded when it shouldn't have !\n";
  505.   }
  506. }
  507.  
  508.  
  509. sub user_query
  510. {
  511.   my ($query,$ignore_error)=@_;
  512.   if (do_query($user_dbh,$query))
  513.   {
  514.     if (!defined($ignore_error))
  515.     {
  516.       die "The above should not have failed!";
  517.     }
  518.   }
  519.   elsif (defined($ignore_error) && $ignore_error == 1)
  520.   {
  521.     die "Query '$query' succeeded when it shouldn't have !\n";
  522.   }
  523. }
  524.  
  525.  
  526. sub do_query
  527. {
  528.   my ($my_dbh, $query)=@_;
  529.   my ($sth,$row,$tab,$col,$found);
  530.  
  531.   print "$query\n" if ($opt_debug || $opt_verbose);
  532.   if (!($sth= $my_dbh->prepare($query)))
  533.   {
  534.     print "Error in prepare: $DBI::errstr\n";
  535.     return 1;
  536.   }
  537.   if (!$sth->execute)
  538.   {
  539.     print "Error in execute: $DBI::errstr\n";
  540.     die if ($DBI::errstr =~ /parse error/);
  541.     $sth->finish;
  542.     return 1;
  543.   }
  544.   $found=0;
  545.   while (($row=$sth->fetchrow_arrayref))
  546.   {
  547.     $found=1;
  548.     $tab="";
  549.     foreach $col (@$row)
  550.     {
  551.       print $tab;
  552.       print defined($col) ? $col : "NULL";
  553.       $tab="\t";
  554.     }
  555.     print "\n";
  556.   }
  557.   print "\n" if ($found);
  558.   $sth->finish;
  559.   return 0;
  560. }
  561.